home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
tasks.c
< prev
Wrap
C/C++ Source or Header
|
1995-03-13
|
4KB
|
226 lines
/*
* MandelVroom 2.0
*
* (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA
*
* All rights reserved.
*
* Permission is hereby granted to distribute this program's source
* executable, and documentation for non-comercial purposes, so long as the
* copyright notices are not removed from the sources, executable or
* documentation. This program may not be distributed for a profit without
* the express written consent of the author Kevin L. Clague.
*
* This program is not in the public domain.
*
* Fred Fish is expressly granted permission to distribute this program's
* source and executable as part of the "Fred Fish freely redistributable
* Amiga software library."
*
* Permission is expressly granted for this program and it's source to be
* distributed as part of the Amicus Amiga software disks, and the
* First Amiga User Group's Hot Mix disks.
*
* contents: this file contains functions used to manage tasks used by
* MandelVroom for picture generation and picture recoloring.
*/
#include "mandp.h"
LONG MainPri = 0;
LONG TaskPri = -1;
LONG pSigMask, pSigBit;
PauseChild( Pict )
register struct Picture *Pict;
{
if (Pict->gTask) {
if (Pict->GenState == GENERATESTATE) {
SetTaskPri( Pict->gTask, MainPri );
Pict->GenState = PAUSESTATE;
Wait( pSigMask );
SetTaskPri( Pict->gTask, TaskPri );
}
}
}
ChildSignal( Pict )
register struct Picture *Pict;
{
#ifdef MULTI
if ( Pict->GenState == PAUSESTATE ) {
Signal( mTask, pSigMask );
Wait( Pict->gSigMask );
}
#endif
}
AwakenChild( Pict )
register struct Picture *Pict;
{
if (Pict->gTask) {
if (Pict->GenState == PAUSESTATE) {
Pict->GenState = GENERATESTATE;
Signal( Pict->gTask, Pict->gSigMask );
if (Pict->gTask->tc_State == TS_WAIT) {
printf("Child still waiting\n");
}
}
}
}
CheckEOL( Pict )
register struct Picture *Pict;
{
ChildPause( Pict );
ReColorLine( Pict );
Pict->CurLine++;
}
KillDoneChild( Pict )
register struct Picture *Pict;
{
if (Pict->gTask) {
SetTaskPri( Pict->gTask, MainPri );
Pict->GenState = KILLSTATE; /* Child is spinning waiting for this */
Wait( pSigMask ); /* wait till child says it notices this */
DeleteTask(Pict->gTask);
Pict->gTask = NULL;
}
}
GetTaskSig( Pict )
register struct Picture *Pict;
{
register LONG bit;
Pict->gSigBit = bit = AllocSignal( (long) -1 );
if ( bit == -1 )
return( UNSUCCESSFUL );
Pict->gSigMask = 1 << bit;
return( SUCCESSFUL );
}
int
OpenTasks()
{
mTask = FindTask( NULL );
mSigBit = AllocSignal( (long) -1 );
if ( mSigBit == -1 ) {
return (-1);
}
mSigMask = 1 << mSigBit;
pSigBit = AllocSignal( (long) -1 );
if ( pSigBit == -1 ) {
FreeSignal( mSigBit );
return (-1);
}
pSigMask = 1 << pSigBit;
return( 0 );
}
CloseTasks()
{
FreeSignal( mSigBit );
FreeSignal( pSigBit );
}
/* This is called by main task */
ThrowTask( Pict )
register struct Picture *Pict;
{
register struct Task *gTask = Pict->gTask;
if (gTask) {
PauseChild( Pict );
DeleteTask( gTask );
Pict->gTask = NULL;
SetGenGad( Pict );
}
}
CloseZoomedPicts( Pict )
register struct Picture *Pict;
{
register struct Node *zNode;
register struct Picture *ZoomPict;
struct Picture *PictAddr();
zNode = Pict->zList.lh_Head;
while ( zNode = RemHead( &Pict->zList ) ) {
ZoomPict = PictAddr( zNode );
CloseZoomBox(ZoomPict);
}
}
/* Calculate pointer to the beginning of Picture struct */
struct Picture *
PictAddr( zNodeAddr )
register struct Node *zNodeAddr;
{
register char *ZoomPict;
ZoomPict = (char *) zNodeAddr;
ZoomPict -= ((char *) &CurPict->zNode - (char *) &CurPict->pNode);
return( (struct Picture *) ZoomPict );
}
PauseReColor( Pict )
register struct Picture *Pict;
{
if (Pict->gTask) {
if (Pict->ColorState == GENERATESTATE) {
Pict->ColorState = PAUSESTATE;
(void) Wait( pSigMask );
}
}
}
ReColorPause( Pict )
register struct Picture *Pict;
{
if ( Pict->ColorState == PAUSESTATE ) {
Signal( mTask, pSigMask );
(void) Wait( 0L );
}
}